package pers.wensheng.patterns.structural_pattern.proxy_pattern.jdk_dynamic_proxy;

import java.lang.reflect.Proxy;

/**
 * 获取代理对象的工厂类
 * 代理类也实现了对应的接口
 */
public class ProxyFactory {

    /**
     * 声名一个目标对象
     */
    private TrainStation station = new TrainStation();
    /**
     * 获取代理对象，不需要任何的参数就可以实现
     * @return
     */
    public SellTickets getProxyObject(){

/*
    ClassLoader loader,         类加载器，用于加载代理类，因为是动态生成的可以通过目标对象获取类加载器。为哪个类创建动态代理
    Class<?>[] interfaces,      代理类实现的接口的字节码对象。这个类实现了什么接口
    InvocationHandler h         代理对象的调用处理程序。动态代理逻辑

    Object proxy,       当前代理对象也就是 sellTickets ，同一个对象，基本不用
    Method method,      对接口中的方法进行封装的 method 对象，也就是封装了原先方法的对象
    Object[] args       就是调用方法的实际参数，也就是原先的实际参数
    返回值就是原先方法的返回值
 */
        /**
         * 返回代理对象即可，jdk里面提供的
         */
        SellTickets sellTickets = (SellTickets) Proxy.newProxyInstance(
                station.getClass().getClassLoader(),
                station.getClass().getInterfaces(),
                (proxy, method, args) -> {
                    //用反射调用，执行目标对象的方法，执行什么对象的目标方法，有没有参数
                    System.out.println("增强方法执行前，收费，jdk动态代理");
                    Object obj = method.invoke(station, args);
                    System.out.println("增强方法执行后");
                    return obj;
                });
        return sellTickets;
    }
}
